package com.klm.easymq.core.adapter;

import com.klm.easymq.core.adapter.config.MQConfig;
import com.klm.easymq.core.adapter.config.ConsumerConfig;
import com.klm.easymq.core.adapter.message.Message;

import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * MQ适配器接口
 * 定义统一的MQ操作规范，支持多种MQ实现
 */
public interface MQAdapter {
    
    /**
     * 获取适配器类型
     * @return 适配器类型标识
     */
    String getType();
    
    /**
     * 初始化适配器
     * @param config MQ配置
     */
    void init(MQConfig config);
    
    /**
     * 发送同步消息
     * @param message 消息对象
     * @return 发送结果
     */
    boolean sendSync(Message message);
    
    /**
     * 发送异步消息
     * @param message 消息对象
     * @return 异步发送结果
     */
    CompletableFuture<Boolean> sendAsync(Message message);
    
    /**
     * 发送单向消息
     * @param message 消息对象
     */
    void sendOneway(Message message);
    
    /**
     * 发送延迟消息
     * @param message 消息对象
     * @param delayLevel 延迟级别
     * @return 发送结果
     */
    boolean sendDelay(Message message, int delayLevel);
    
    /**
     * 发送顺序消息
     * @param message 消息对象
     * @param hashKey 用于选择队列的key
     * @return 发送结果
     */
    boolean sendOrdered(Message message, String hashKey);
    
    /**
     * 批量发送消息
     * @param messages 消息列表
     * @return 发送结果列表
     */
    List<Boolean> sendBatch(List<Message> messages);
    
    /**
     * 启动消费者
     * @param config 消费者配置
     */
    void startConsumer(ConsumerConfig config);
    
    /**
     * 停止消费者
     * @param consumerId 消费者ID
     */
    void stopConsumer(String consumerId);
    
    /**
     * 检查连接健康状态
     * @return 是否健康
     */
    boolean isHealthy();
    
    /**
     * 关闭适配器
     */
    void shutdown();
    
    /**
     * 获取适配器状态信息
     * @return 状态信息
     */
    AdapterStatus getStatus();
    
    /**
     * 适配器状态
     */
    enum AdapterStatus {
        /**
         * 未初始化
         */
        UNINITIALIZED,
        
        /**
         * 已初始化
         */
        INITIALIZED,
        
        /**
         * 运行中
         */
        RUNNING,
        
        /**
         * 已关闭
         */
        SHUTDOWN,
        
        /**
         * 错误状态
         */
        ERROR
    }
} 